package com.hspedu.codeblock;

/**
 * @Author Stringzhua
 * @Date 2024/3/5 16:33
 * description:代码块使用注意事项和细节讨论
 * 1.static代码块也叫做静态代码块,而且它随着类的加载而执行,并且只会执行一次
 * 如果是普通代码块,每创建一个对象,就执行
 *
 * 2.类什么时候被加载
 * ①创建对象实例时(new)
 * ②创建子类对象实例,父类也会被加载
 * ③使用类的静态成员时(静态属性 静态方法)
 * A类 extends B类 的静态代码块
 *
 * 3.普通的代码块,在创建对象实例时,会被隐式的调用  即被创建一次,就调用一次
 * 如果只是使用类的静态成员时,普通代码块并不会执行
 *
 * ============================
 * 小结:
 * 1.static代码块是类加载时执行,只会执行一次
 * 2.普通代码块是在创建对象时调用的,创建一次,调用一次
 * 3.类加载的3种情况,需要记住
 */
public class CodeBlockDetail {
    public static void main(String[] args) {
        //1.创建静态实例对象时
//        AA aa = new AA();
        //2.创建子类对象实例,父类也会被加载,而且,父类先被加载,子类后被加载
//        AA aa = new AA();//先建立继承关系,先加载父类,再加载子类
        //3.使用类的静态成员时(静态属性,静态方法)
//        System.out.println(Cat.n1);

        //static代码块,是在类加载时执行的,而且只会执行一次
//        DD dd = new DD();
//        DD dd1 = new DD();

        //普通的代码块,在创建对象实例时,会被隐式的调用
        //被创建一次,就会调用一次.如果只是使用类的静态成员时,普通代码块并不会执行
        System.out.println(DD.n1);//可以
    }
}

class DD {
    public static int n1 = 8888;//静态属性

    //静态代码块
    static {
        System.out.println("DD的静态代码块被执行....");
    }

    //普通代码块,new 对象时,被调用,而且是每创建对象就调用一次
    //和类是否加载没有关系
    //可以这样的理解,普通代码块是构造器的补充
    {
        System.out.println("DD 的普通代码块....");
    }
}

class Animal {
    //静态代码块
    static {
        System.out.println("Animal的静态代码块被执行....");
    }
}

class Cat extends Animal {
    public static int n1 = 996;//静态属性

    //静态代码块
    static {
        System.out.println("Cat的静态代码块1被执行....");
    }
}

class BB {
    //静态代码块
    static {
        System.out.println("BB的静态代码块1被执行....");
    }
}

class AA extends BB {
    //静态代码块
    static {
        System.out.println("AA的静态代码块1被执行....");
    }
}
